/**
 * Copyright 厦门中软海晟信息技术有限公司 版权所有 违者必究 2019
 */
package com.opencvjava.lessons.imgproc;

import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.springframework.stereotype.Service;

import static com.opencvjava.support.util.CvUtils.imshow;
import static com.opencvjava.support.util.CvUtils.mat;
import static org.opencv.imgproc.Imgproc.*;
import static org.opencv.imgcodecs.Imgcodecs.*;
import static org.opencv.core.Core.*;

/**
 * @author : sunzb(sunzb@hsit.com.cn)
 * @date: 2019/1/4
 */
@Service
//白色 255， 代表有
//黑色 0， 代表无
// dilate 膨胀，更有，更骄傲，有侵占无
// erode 腐蚀，更没有，更堕落，无侵占有
// 多通道和单通道白黑的道理一样
// 该实例不像官方写大量界面代码，保持代码清爽易学
public class L4_ErodingAndDilating {
    private static final int MAX_KERNEL_SIZE = 21;
    public void test() {
        Mat matImgSrc = mat("lena.jpg");
        if (matImgSrc.empty()) {
            throw new RuntimeException("图片读取失败");
        }
        Mat matImgDst = new Mat();
        for (int i = 1; ; i++) {
            int kernelSize = 2 * i + 1;
            if (kernelSize > MAX_KERNEL_SIZE) {
                break;
            }
            // 这里用CV_SHAPE_RECT(方形)的方式膨胀腐蚀，还可以用CV_SHAPE_CROSS、CV_SHAPE_CROSS
            Mat element = getStructuringElement(CV_SHAPE_RECT,
                    new Size(kernelSize, kernelSize),
                    new Point(i, i));
            erode(matImgSrc, matImgDst, element);
            imshow("腐蚀，核大小:" + kernelSize, matImgDst);
            dilate(matImgSrc, matImgDst, element);
            imshow("膨胀，核大小:" + kernelSize, matImgDst);
        }
    }
}
